﻿using System;
using System.Threading;
using System.Threading.Tasks;

namespace _059_取消并行任务
{
    class Program
    {
        static async Task Main(string[] args)
        {
            CancellationTokenSource 累加计算 = new CancellationTokenSource();

            Task.Run(()=>
            {
                Console.WriteLine("按C键取消任务。");
                while (true)
                {
                    var 停止 = Console.ReadKey(true);
                    if (停止.Key==ConsoleKey.C)
                    {
                        累加计算.Cancel();
                        break;
                    }
                }
            });

            //调用异步方法，并等待计算完成
            int 结果 = await RunAsync(200, 累加计算.Token);
            Console.WriteLine("计算结果：{0}", 结果);
        }

        //定义用于执行累加计算的异步方法
        static Task<int> RunAsync(int maxNum,CancellationToken token = default)
        {
            TaskCompletionSource<int> 计算1 = new TaskCompletionSource<int>();
            int x = 0;
            int res = 0;
            while (x<maxNum)
            {
                if (token.IsCancellationRequested)
                {
                    break;
                }
                res += x;
                x += 1;
                Task.Delay(500).Wait();
            }
            计算1.SetResult(res);
            return 计算1.Task;
        }
    }
}
